require "import"
import "android.content.Context"
import "android.os.Vibrator"
import "android.media.ToneGenerator"
import "android.media.AudioManager"
import "android.widget.*"
import "com.androlua.*"
import "android.net.Uri"
import "android.content.Intent"
import "android.text.Html"
import "java.net.URLEncoder"
import "java.util.Locale"
import "android.content.ClipboardManager"
import "android.content.ClipData"
import "android.graphics.Color"

local context = activity or service
local vibrator = context.getSystemService(Context.VIBRATOR_SERVICE)
vibrator.vibrate(200)

local translationResult = ""
local fullTranslation = ""
local languageCodes = {
    ["#7 باكستان الأردية"] = "ur",
    ["السندهية"] = "sd",
    ["البشتو"] = "ps",
    ["البلوشية"] = "bal",
    ["السرائيكية"] = "skr",
    ["البراهوية"] = "brh",
    ["#1 الهندية"] = "hi",
    ["البنغالية الهند"] = "bn",
    ["التيلجو"] = "te",
    ["#4 الماراثية"] = "mr",
    ["التاميل"] = "ta",
    ["#3 الأردية الهند"] = "ur",
    ["#6 الغوجاراتية"] = "gu",
    ["المالايالام"] = "ml",
    ["الكانادا"] = "kn",
    ["الأوريا"] = "or",
    ["#5 البنجابية الهند"] = "pa",
    ["الأسامية"] = "as",
    ["المايثيلية"] = "mai",
    ["السانتالية"] = "sat",
    ["البنغالية بنغلاديش"] = "bn",
    ["الشيتاغونغية"] = "ctg",
    ["السيلهيتية"] = "syl",
    ["الروهينغية"] = "rhg",
    ["الصينية الماندارين"] = "zh",
    ["الكانتونية"] = "yue",
    ["الصينية الوو (الشنگهاي)"] = "wuu",
    ["الهاكا"] = "hak",
    ["المين نان (الهوكيين)"] = "nan",
    ["العربية"] = "ar",
    ["الفارسية"] = "fa",
    ["الكردية"] = "ku",
    ["الدارية"] = "prs",
    ["البشتو أفغانستان"] = "ps",
    ["العبرية"] = "he",
    ["#2 الإنجليزية"] = "en",
    ["الفرنسية"] = "fr",
    ["الألمانية"] = "de",
    ["الإسبانية"] = "es",
    ["الإيطالية"] = "it",
    ["البرتغالية"] = "pt",
    ["الهولندية"] = "nl",
    ["الروسية"] = "ru",
    ["اليونانية"] = "el",
    ["البولندية"] = "pl",
    ["الأوكرانية"] = "uk",
    ["التشيكية"] = "cs",
    ["المجرية"] = "hu",
    ["السويدية"] = "sv",
    ["الدانماركية"] = "da",
    ["الفنلندية"] = "fi",
    ["النرويجية"] = "no",
    ["الرومانية"] = "ro",
    ["البلغارية"] = "bg",
    ["الصربية"] = "sr",
    ["الكرواتية"] = "hr",
    ["السلوفاكية"] = "sk",
    ["السلوفينية"] = "sl",
    ["السواحيلية"] = "sw",
    ["الهوسا"] = "ha",
    ["اليوروبا"] = "yo",
    ["الإيغبو"] = "ig",
    ["الأمهرية"] = "am",
    ["الزولو"] = "zu",
    ["الخوسا"] = "xh",
    ["الصومالية"] = "so",
    ["الأفريكانية"] = "af",
    ["الإندونيسية"] = "id",
    ["الملايو"] = "ms",
    ["التايلاندية"] = "th",
    ["الفيتنامية"] = "vi",
    ["الفلبينية (التاغالوغ)"] = "tl",
    ["البورمية"] = "my",
    ["الخميرية (الكمبودية)"] = "km",
    ["اللاو"] = "lo",
    ["الكيتشوا"] = "qu",
    ["الغواراني"] = "gn",
    ["الكريولية الهايتية"] = "ht",
    ["المايا (اليوكاتيك)"] = "yua",
    ["النافاجو"] = "nv",
}

local items = {}
for language, code in pairs(languageCodes) do
    table.insert(items, language)
end
table.sort(items)

function capitalizeFirstWord(str)
    return str:gsub("^%l", string.upper)
end

function addPunctuation(str)
    return str .. "."
end

function hasInternetConnection()
    local connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE)
    local networkInfo = connectivityManager.getActiveNetworkInfo()
    return networkInfo ~= nil and networkInfo.isConnected()
end

if not hasInternetConnection() then
    noInternet = LuaDialog()
    noInternet.setTitle("مشكلة في الإنترنت")
    noInternet.setMessage("لا يوجد اتصال بالإنترنت. لا يمكن ترجمة اللغة")
    noInternet.setButton("موافق", nil)
    vibrator.vibrate(800)
    noInternet.show()
    return false 
end

local function splitTextIntoChunks(text, maxChunkSize)
    local chunks = {}
    for i = 1, #text, maxChunkSize do
        table.insert(chunks, text:sub(i, i + maxChunkSize - 1))
    end
    return chunks
end

local layout = {
    LinearLayout;
    layout_width = "fill";
    layout_height = "fill";
    orientation = "vertical";
    padding = "16dp";
    {
        TextView;
        text = "ترجمة جوجل";
        textColor = Color.WHITE;
        textSize = "24sp";
        gravity = "center";
        layout_width = "fill";
    };
    {
        TextView;
        text = "تم تطويره بواسطة سايح فتحي";
        textColor = Color.LTGRAY;
        textSize = "14sp";
        gravity = "center";
        layout_width = "fill";
        layout_marginBottom = "10dp";
    };
    {
        EditText,
        id = "searchBox";
        layout_width = "fill";
        layout_height = "wrap";
        hint = "البحث عن لغة";
    };
    {
        ListView,
        id = "grid";
        layout_width = "fill";
        layout_height = "0dp";
        layout_weight = 1;
    },
    {
        ScrollView,
        layout_width = "fill";
        {
            LinearLayout;
            layout_width = "fill";
            layout_height = "wrap";
            orientation = "horizontal";
            gravity = "center"; -- لتوسيط محتويات الصف بالكامل
            {
                Button,
                id = "exitButton";
                text = "إلغاء";
                layout_width = "wrap_content"; -- جعل عرض الزر مناسباً للنص لتسهيل توسيطه
            }
        }
    }
}

dlg = LuaDialog(context)
dlg.View = loadlayout(layout)

local adapter = ArrayAdapter(service, android.R.layout.simple_list_item_1, items)
_G.grid.adapter = adapter

local function showTranslationResultDialog(translatedText)
    fullTranslation = translatedText
    local dialogLayout = {
        ScrollView,
        {
            LinearLayout,
            layout_width = "fill";
            layout_height = "fill";
            orientation = "vertical";
            padding = "16dp";
            {
                TextView;
                id = "translatedText";
                layout_width = "fill";
                layout_height = "wrap";
                text = translatedText;
            };
            {
                LinearLayout;
                layout_width = "fill";
                layout_height = "wrap";
                orientation = "horizontal";
                gravity = "center";
                {
                    Button,
                    id="translated_text_speak",
                    text="نطق",
                    layout_width="wrap_content",
                    layout_height="wrap_content",
                    onClick=function(view)
                        import "android.speech.tts.*"
                        import "java.util.*"
                        tts = TextToSpeech(this, TextToSpeech.OnInitListener({
                            onInit=function(exist)
                                if exist == TextToSpeech.SUCCESS then
                                    tts.setLanguage(Locale("hi","IN"))
                                    tts.setEngineByPackageName("com.google.android.tts")
                                    textForTTS= translatedText
                                    tts.speak(tostring(textForTTS),TextToSpeech.QUEUE_FLUSH,nil,nil)
                                end
                            end
                        }))
                    end
                },
                {
                    Button;
                    id = "copyButton";
                    text = "نسخ";
                    layout_width = "wrap";
                },
                {
                    Button,
                    text="إرسال إلى الذكاء الاصطناعي",
                    onClick=function(view)
                        require "import"
                        json = require "cjson"
                        user_text = translatedText
                        local url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=apikey"
                        type_to = { ["Content-Type"] = "application/json" }

                        body = {
                            contents = {
                                { parts = {
                                    {text = "You are a smart, friendly, and positive persona who takes the user’s input text, creatively enhances it by making it more interesting and impressive—like swapping simple words for elegant alternatives or adding subtle emojis—without adding any extra unrelated content; respond only with the modified version in English. " .. tostring(user_text)}
                                }}
                            }
                        }

                        Http.post(url, json.encode(body), type_to, function(success, result)
                            if success == 200 then
                                data = json.decode(result)
                                ld = LuaDialog(this)
                                ld.setTitle("رد الذكاء الاصطناعي")
                                ld.setMessage(data.candidates[1].content.parts[1].text)
                                ld.setButton("إغلاق",nil)
                                ld.show()
                            else 
                                print(success)
                            end
                        end)
                    end
                },
                {
                    Button;
                    id = "shareButton";
                    text = "مشاركة";
                    layout_width = "wrap";
                };
            },
            {
                LinearLayout,
                orientation="horizontal",
                {
                    Button,
                    id="save_translated_text_in_storage",
                    text="حفظ في ملف",
                    layout_width="wrap",
                    layout_height="wrap_content",
                    textSize="28sp",
                    onClick=function(view)
                        local FileName="نتائج ترجمة جوجل.txt"
                        local Path = "/storage/emulated/0/"..FileName
                        local OpenFileForApand = io.open(Path, "a")
                        if not OpenFileForApand then
                            local CreateFile = io.open(Path, "w")
                            CreateFile:write("")
                            CreateFile.close()
                        end
                        local UserText = translatedText
                        OpenFileForApand:write(UserText.."\n\n")
                        OpenFileForApand:close()
                    end
                },
                {
                    Button;
                    id = "closeButton";
                    text = "إغلاق";
                    layout_width = "wrap_content",
                }
            }
        }
    }

    local translationDialog = LuaDialog(context)
    translationDialog.setTitle("نتيجة الترجمة")
    translationDialog.View = loadlayout(dialogLayout)

    _G.copyButton.onClick = function()
        local clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE)
        local clip = ClipData.newPlainText("Translated Text", translatedText)
        clipboard.setPrimaryClip(clip)
        
        vibrator.vibrate(150)
        service.speak("تم نسخ الترجمة!")
    end

    _G.shareButton.onClick = function()
        local shareIntent = Intent(Intent.ACTION_SEND)
        shareIntent.setType("text/plain")
        shareIntent.putExtra(Intent.EXTRA_TEXT, fullTranslation)
        translationDialog.dismiss()
        context.startActivity(Intent.createChooser(shareIntent, "مشاركة الترجمة"))
    end

    _G.closeButton.onClick = function()
        translationDialog.dismiss()
    end

    vibrator.vibrate(800)
    for a = 1, 50 do
        service.playSoundTick()
    end
    translationDialog.show()
end

local function performTranslation(text, languageCode)
    local MAX_CHUNK_SIZE = 5000
    local chunks = splitTextIntoChunks(text, MAX_CHUNK_SIZE)
    local translatedChunks = {}
    local completedChunks = 0

    for index, chunk in ipairs(chunks) do
        local defaultLanguage = Locale.getDefault().getLanguage()
        local encodedChunk = URLEncoder.encode(chunk, "UTF-8")
        local url = "https://translate.google.com/m?sl=auto&hl=" .. defaultLanguage .. 
                   "&q=" .. encodedChunk .. "&tl=" .. languageCode

        Http.get(url, function(status, result)
            if status == 200 then
                local translation = result:match('<div class="result%-container">([^<]+)</div>')
                if translation then
                    translation = tostring(Html.fromHtml(translation))
                    translation = capitalizeFirstWord(translation)
                    translation = addPunctuation(translation)
                    
                    translatedChunks[index] = translation
                    completedChunks = completedChunks + 1

                    vibrator.vibrate(10 * index)

                    if completedChunks == #chunks then
                        local fullTranslation = table.concat(translatedChunks, " ")
                        showTranslationResultDialog(fullTranslation)
                        vibrator.vibrate(10)
                    end
                else
                    print("Translation extraction failed for chunk: " .. index)
                end
            else
                print("Translation error for chunk " .. index .. ". Status: " .. tostring(status))
                vibrator.vibrate(10)
            end
        end)
    end
end

dlg.show()

_G.searchBox.addTextChangedListener{
    onTextChanged = function(s, start, before, count)
        local keyword = s.toString()
        local filteredItems = {}
        for _, language in ipairs(items) do
            if language:lower():find(keyword:lower()) then
                table.insert(filteredItems, language)
            end
        end
        local totalFilter = #filteredItems
        service.postSpeak(10, "تم تصفية " .. tostring(totalFilter) .. " لغة")
        adapter.clear()
        adapter.addAll(filteredItems)
        adapter.notifyDataSetChanged()
    end
}

_G.grid.onItemClick = function(l, v, s)
    dlg.dismiss()
    task(1, function()
        local language = v.text
        local languageCode = languageCodes[language]
        service.speak(v.text .. " " .. languageCode)

        if languageCode then
            local textToTranslate = tostring(node.Text or "")
            if textToTranslate ~= "" then
                performTranslation(textToTranslate, languageCode)
            else
                print("النص المحدد فارغ!")
            end
        else
            local errorDialog = LuaDialog(context)
            errorDialog.setTitle("خطأ")
            errorDialog.setMessage("اللغة غير مدعومة")
            errorDialog.setPositiveButton("موافق", function()
                errorDialog.dismiss()
            end)
            errorDialog.show()
        end
    end)
end

_G.exitButton.onClick = function()
    service.playSoundTick()
    dlg.dismiss()
end
